//
//  LZTStatusDAL.swift
//  LZTWeibo
//
//  Created by Yin jianxun on 16/8/22.
//  Copyright © 2016年 YinJianxun. All rights reserved.
//

/*  
    数据处理层:
    该类用于处理首页的数据处理
        保存数据-查询数据-检查恩地是否有缓存数据-清理缓存-网络请求数据
 
 CREATE TABLE IF NOT EXISTS "T_Status" (
 "status" TEXT,
 "statusid" INTEGER NOT NULL,
 "userid" INTEGER NOT NULL,
 "createtime" TEXT DEFAULT (datetime('now','localtime')),
 PRIMARY KEY("statusid","userid")
 )
 
 */

import UIKit

class LZTStatusDAL: NSObject {
    
    //检查本地是否有 缓存数据,由于会开启子线程，因此只能闭包返回数据
    class func checkOutCche(sinceId: Int64, maxId: Int64, finish:((res:[[String: AnyObject]]?)->())) {
        
        //获取 缓存数据
        let result = LZTStatusDAL.getCache(sinceId, maxId: maxId)
        
        if result?.count > 0 {
            
            //代表有缓存数据,直接返回本地缓存数据
            print("----本地获取缓存数据")
            finish(res: result)
            
        }else {
            print("****网络获取缓存数据")
            //代表无缓存数据
            //进行 网络请求数据
            LZTNetworkTools.sharedTools.homeLoadData(sinceId, maxId: maxId, success: { (response) in
                
                //判断response的正确性 并判断response中返回值可否转成数组
                guard let res = response?["statuses"] as? [[String: AnyObject]] else {
                    finish(res: nil)
                    return
                }
                
                //保存数据到本地
                LZTStatusDAL.saveCache(res)
                //闭包返回数据 子线程的缘故
                finish(res: res)
                
                }, failure: { (error) in
                    finish(res: nil)
                    print("请求微博数据失败-网络")
            })
        }
    }
    
    //查询数据
    class func getCache(sinceId: Int64, maxId: Int64) -> [[String: AnyObject]]? {
        
        //当sinceId maxId 都是0的时候，也就是第一次登录时，应该网络获取数据
        if sinceId == 0 && maxId == 0 {
            return nil
        }
        
        //获取userId
        guard let userId = LZTUserAccountViewModel.sharedTools.userAccount?.uid else {
            
            //如果用户从没登录过时，返回nil
            return nil
        }
        
        // 准备sql
        var sql = ""
        sql += "SELECT * FROM T_Status\n"
        sql += "WHERE userid=\(userId)\n"
        // 下拉刷新
        if sinceId > 0 {
            sql += "AND statusid>\(sinceId)\n"
            
        }
        // 上拉加载更多
        if maxId > 0 {
            sql += "AND statusid<=\(maxId)\n"
        }
        sql += "ORDER BY statusid DESC\n"
        sql += "LIMIT 20"
        
        //执行SQL
        let result = LZTSqlManager.sharedTools.executeRecordForSql(sql)
        
        //创建一个可变数组
        var tempArray:[[String: AnyObject]] = [[String: AnyObject]]()
        
        //序列化 将获得数据二进制转成字典
        for dic in result {
            
            let data = dic["status"] as! NSData
            
            //二进制转字典
            let dict = try! NSJSONSerialization.JSONObjectWithData(data, options: [])
            
            //保存字典
            tempArray.append(dict as! [String: AnyObject])
            
        }
        
        return tempArray
        
    }
    
    //保存数据
    class func saveCache(response: [[String: AnyObject]]) {
        
        //获取 用户ID
        guard let userId = LZTUserAccountViewModel.sharedTools.userAccount?.uid else {
            return
        }
        
        // 准备SQL  登录或者替换
        let sql = "insert or replace into T_Status (status, statusid, userid) values (?, ?, ?)"
        
        //执行SQL
        LZTSqlManager.sharedTools.queue.inTransaction { (db, rollback) in
            
            for dic in response {
                
                //微博id
                let statusId = dic["id"] as! NSNumber
                //微博数据 dic 转成 二进制数据
                let data = try! NSJSONSerialization.dataWithJSONObject(dic, options: [])
                
                if db.executeUpdate(sql, withArgumentsInArray: [data, statusId, userId]) {
                    //保存数据成功
                    print("保存数据成功")
                }else {
                    
                    //保存数据失败
                    print("保存数据失败")
                    //执行回滚
                    rollback.memory = true
                    
                }
            }
        }
    }
    
    //清除缓存数据
    class func deleteCache() {
        
        //设置多长时间(暂定 两个小时)以前的数据 清除
        let date = NSDate().dateByAddingTimeInterval(-60*60*2)
        
        let df = NSDateFormatter()
        df.locale = NSLocale(localeIdentifier: "en_US")
        df.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let timeStr = df.stringFromDate(date)
        
        //准备SQL
        let sql = "delete from T_Status where createtime < '\(timeStr)'"
        
        //执行SQL
        LZTSqlManager.sharedTools.queue.inDatabase { (db) in
            
            if db.executeUpdate(sql, withArgumentsInArray: nil) {
                print("清除缓存数据成功")
            }else {
                print("清除缓存数据失败")
            }
        }
    }
}
